home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 176-200 / 189 / nethack / eenamiga.zoo / Amiga / amigaTermcap.c < prev    next >
C/C++ Source or Header  |  1988-07-12  |  5KB  |  281 lines

  1. /*    SCCS Id: @(#)termcap.c    2.1    87/10/19
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3.  
  4. #include <stdio.h>
  5. #include <ctype.h>    /* for isdigit() */
  6. #include "hack.h"     /* for ROWNO, COLNO, *HI, *HE */
  7.  
  8. #define xputc(c)    WindowPutchar(c)
  9. #define xputs(s)    WindowFPuts(s)
  10.  
  11. extern char *getenv();
  12. extern long *alloc();
  13.  
  14. static char HO[] = "\x9BH";         /* Home */
  15. static char CL[] = "\x1Bc";         /* Clear */
  16. static char CE[] = "\x9BK";         /* Erase end of line */
  17. static char UP[] = "\x0B";          /* Cursor up */
  18. static char CM[] = "\x9B%d;%dH";    /* used with function tgoto() */
  19. static char ND[] = "\x9BC";         /* Cursor right */
  20. static char XD[] = "\x9BB";         /* Cursor down */
  21. static char BC[] = "\x08";          /* Cursor left */
  22.  
  23. #ifdef MSDOSCOLOR    /* creps@silver.bacs.indiana.edu */
  24. static char SO[] = "\x9B33m";       /* Standout: Color #3 (red) */
  25. static char SE[] = "\x9B0m";
  26.  
  27. #else
  28.  
  29. static char SO[] = "\x9B7m";        /* Inverse video */
  30. static char SE[] = "\x9B0m";
  31. #endif
  32.  
  33. char *CD = "\x9BJ"; /* char *CD; tested in pri.c: docorner() */
  34.  
  35. /* #if defined(DGK) || defined(SORTING) */
  36. #ifdef DGK
  37. # define XXX
  38. #endif
  39. #ifdef SORTING
  40. # define XXX
  41. #endif
  42.  
  43. #ifdef XXX
  44. # ifdef MSDOSCOLOR
  45. char *HI_OBJ = "\x9B31;42m";        /* White on Black */
  46. char *HI_MON = "\x9B33;42m";        /* Orange on black */
  47. char *HI = "\x9B1m";                /* Bold (hilight) */
  48. char *HE = "\x9B0m";                /* Plain */
  49. # else
  50. char *HI_OBJ = "";
  51. char *HI_MON = "";
  52. char *HI = "\x9B4m";                /* Underline */
  53. char *HE = "\x9B0m";                /* Plain */
  54. # endif
  55. #endif
  56. #undef XXX
  57.  
  58. int CO = COLNO;
  59. int LI = ROWNO;     /* used in pri.c and whatis.c */
  60.  
  61. static char tgotobuf[20];
  62. #define tgoto(fmt, x, y)    (sprintf(tgotobuf, fmt, y+1, x+1), tgotobuf)
  63.  
  64. startup()
  65. {
  66.     (void) Initialize();    /* This opens screen, window, console, &c */
  67. }
  68.  
  69. start_screen()
  70. {
  71. }
  72.  
  73. end_screen()
  74. {
  75.     clear_screen();
  76. }
  77.  
  78. /* Cursor movements */
  79. extern xchar curx, cury;
  80.  
  81. #ifdef TERMCAP
  82.  
  83. curs(x, y)
  84. register int x, y;    /* not xchar: perhaps xchar is unsigned and
  85.            curx-x would be unsigned as well */
  86. {
  87.  
  88.     if (y == cury && x == curx)
  89.     return;
  90.     if(!ND && (curx != x || x <= 3)) {    /* Extremely primitive */
  91.     cmov(x, y);            /* bunker!wtm */
  92.     return;
  93.     }
  94.     if(abs(cury-y) <= 3 && abs(curx-x) <= 3)
  95.     nocmov(x, y);
  96.     else if((x <= 3 && abs(cury-y)<= 3) || (!CM && x<abs(curx-x))) {
  97.     (void) putchar('\r');
  98.     curx = 1;
  99.     nocmov(x, y);
  100.     } else if(!CM) {
  101.     nocmov(x, y);
  102.     } else
  103.     cmov(x, y);
  104. }
  105.  
  106. nocmov(x, y)
  107. {
  108.     if (cury > y) {
  109.     if(UP) {
  110.         while (cury > y) {    /* Go up. */
  111.         xputs(UP);
  112.         cury--;
  113.         }
  114.     } else if(CM) {
  115.         cmov(x, y);
  116.     } else if(HO) {
  117.         home();
  118.         curs(x, y);
  119.     } /* else impossible("..."); */
  120.     } else if (cury < y) {
  121.     if(XD) {
  122.         while(cury < y) {
  123.         xputs(XD);
  124.         cury++;
  125.         }
  126.     } else if(CM) {
  127.         cmov(x, y);
  128.     } else {
  129.         while(cury < y) {
  130.         xputc('\n');
  131.         curx = 1;
  132.         cury++;
  133.         }
  134.     }
  135.     }
  136.     if (curx < x) {        /* Go to the right. */
  137.     if(!ND) cmov(x, y); else    /* bah */
  138.         /* should instead print what is there already */
  139.     while (curx < x) {
  140.         xputs(ND);
  141.         curx++;
  142.     }
  143.     } else if (curx > x) {
  144.     while (curx > x) {    /* Go to the left. */
  145.         xputs(BC);
  146.         curx--;
  147.     }
  148.     }
  149. }
  150.  
  151. cmov(x, y)
  152. register x, y;
  153. {
  154.     xputs(tgoto(CM, x-1, y-1));
  155.     cury = y;
  156.     curx = x;
  157. }
  158.  
  159. #else /* !TERMCAP */
  160.  
  161. curs(x, y)
  162. register x, y;
  163. {
  164.     if (x != curx || y != cury) {
  165.     xputs(tgoto(CM, x-1, y-1));
  166.     cury = y;
  167.     curx = x;
  168.     }
  169. }
  170. #endif /* TERMCAP */
  171.  
  172. #ifndef xputc
  173. xputc(c) char c; {
  174.     (void) putchar(c, stdout);
  175. }
  176. #endif
  177.  
  178. #ifndef xputs
  179. xputs(s) char *s; {
  180.     WindowFPuts(s);
  181. }
  182. #endif
  183.  
  184. cl_end() {
  185. #ifdef TERMCAP
  186.     if(CE)
  187.     xputs(CE);
  188.     else {    /* no-CE fix - free after Harold Rynes */
  189.     /* this looks terrible, especially on a slow terminal
  190.        but is better than nothing */
  191.     register cx = curx, cy = cury;
  192.  
  193.     while(curx < COLNO) {
  194.         xputc(' ');
  195.         curx++;
  196.     }
  197.     curs(cx, cy);
  198.     }
  199. #else
  200.     xputs(CE);
  201. #endif
  202. }
  203.  
  204. clear_screen() {
  205.     xputs(CL);
  206.     home();
  207. }
  208.  
  209. home()
  210. {
  211. #ifdef TERMCAP
  212.     if(HO)
  213.     xputs(HO);
  214.     else if(CM)
  215.     xputs(tgoto(CM, 0, 0));
  216.     else
  217.     curs(1, 1);    /* using UP ... */
  218. #else
  219.     xputs(HO);
  220. #endif
  221.     curx = cury = 1;
  222. }
  223.  
  224. standoutbeg()
  225. {
  226. #ifdef TERMCAP
  227.     if(SO)
  228. #endif
  229.     xputs(SO);
  230. }
  231.  
  232. standoutend()
  233. {
  234. #ifdef TERMCAP
  235.     if(SE)
  236. #endif
  237.     xputs(SE);
  238. }
  239.  
  240. backsp()
  241. {
  242.     xputs(BC);
  243.     curx--;
  244. }
  245.  
  246. bell()
  247. {
  248. #ifdef DGKMOD
  249.     if (flags.silent) return;
  250. #endif /* DGKMOD /**/
  251.     (void) putchar('\007');        /* curx does not change */
  252.     (void) fflush(stdout);
  253. }
  254.  
  255. delay_output() {
  256.     /* delay 50 ms - could also use a 'nap'-system call */
  257.     Delay(2L);
  258. }
  259.  
  260. cl_eos()            /* free after Robert Viduya */
  261. {         /* must only be called with curx = 1 */
  262. #ifdef TERMCAP
  263.     if(CD)
  264.     xputs(CD);
  265.     else {
  266.     register int cx = curx, cy = cury;
  267.     while(cury <= LI-2) {
  268.         cl_end();
  269.         xputc('\n');
  270.         curx = 1;
  271.         cury++;
  272.     }
  273.     cl_end();
  274.     curs(cx, cy);
  275.     }
  276. #else
  277.     xputs(CD);
  278. #endif
  279. }
  280.  
  281.